package xml.hcard;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.DOMBuilder;
import org.microformats.hCard.HCard;
import org.restlet.ext.xml.DomRepresentation;
import org.restlet.representation.Representation;
import xml.jdom.AbstractJDOMElement;

/**
 * Classe abstraite de base pour une fabrique de HCARD
 * @author marya
 */
public abstract class AbstractHCARDFactory extends AbstractJDOMElement implements HCARDFactory {

    protected Document document;
    protected List<HCard> hcards;
    protected String uri;

    /**
     * Constructeur qui prend en argument une URI
     * Celle ci sera nécessaire dans la fabrique de hCard à partir de flux
     * reçus par appel à l'uri
     * @param uri
     */
    protected AbstractHCARDFactory(String uri) {
        this.uri = uri;
        this.hcards = new ArrayList<HCard>();
    }

    protected Document getJDOMDocument(Representation representation) throws IOException {
        DomRepresentation domR = new DomRepresentation(representation);
        DOMBuilder builder = new DOMBuilder();
        return builder.build(domR.getDocument());
    }

    /**
     * Méthode qui parse le flus xml et le met dans le document
     * JDOM
     * @return
     * @throws IOException
     */
    public abstract HCARDFactory start() throws IOException;

    /**
     * Methode qui permet de générer le flux xml où sont contenus les hCards
     * @return
     */
    public Element toJDOMElement() {
        Element racine = new Element("hcards");
        Element eHcard = null;
        if (!hcards.isEmpty()) {
            for (HCard hcard : hcards) {
                eHcard = new Element("hcard");
                eHcard.setText(hcard.toHTML());
                racine.addContent(eHcard);
            }
        }

        return racine;
    }
}
